package edu.zut.jpa_demo.repository;

import edu.zut.jpa_demo.entity.AyUser;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

import java.util.List;


//数据层接口继承JpaRepository,同时指定实体类型以及主键类型，JpaSpecificationExecutor：jpa规范执行器（用于构建动态sql）
public interface AyUserRepository extends JpaRepository<AyUser, Integer>, JpaSpecificationExecutor<AyUser> {
    //手动根据jpa规范，在数据层接口中定义方法，定义好之后，jpa帮助我们自动根据规范生成对应的sql
    //方法命名查询    返回值 注意： 对象 、 list 、set 不要 map  数组
    List<AyUser> queryByNameLike(String name);

    //根据性别以及指定的年龄范围查询数据
    List<AyUser> queryByAgeBetweenAndGender(Integer from,Integer to,String gender);

    //根据姓名模糊查询并根据年龄进行倒序
    List<AyUser> queryByNameLikeOrderByAgeDesc(String name);

    //根据名字模糊查询记录数
    Long countByNameLike(String name);

    //删除数据
    void removeByMail(String mail);

    //判断是否存在
    boolean existsByName(String name);

    // @Query注解默认采用的是JPQL语法，面向对象的sql,  from后是实体类的名称    from前面的查询可以不谢
    @Query("from AyUser group by age")
    List<AyUser> findGroupByAge();

    @Query("from AyUser where gender = ?1")
    List<AyUser> findByGender(String gender);

    //如果使用原生sql   nativeQuery = true 使用原生sql      sql中的占位符 ?  默认根据顺序匹配参数  ?1  ?2   ?3
    @Query(value = "select * from ay_user where name like ?1 order by age desc",nativeQuery = true)
    List<AyUser> findByNameLikeOrderByAgeDesc(String name);


    //自定义一个方法完成更新操作   @Modifying   将@Query查询修改为更新或删除操作    测试时注意，需要添加事务注解才能完成
    @Modifying
    @Query("update AyUser set age = ?1 where name = ?2")
    void updateAgeByName(Integer age,String name);


    @Modifying
    @Query("delete from AyUser where age = ?1")
    void removeByAge(Integer age);



}
